// 函数内部的 arguments 变量

// 用"函数声明"定义函数
function add(a, b) {
    // 在函数内部可以通过 arguments 获得调用函数时传入的实参
    console.log( arguments );
    // 获得当前函数本尊
    let self = arguments.callee;
    console.log( self );
    // 获得函数的调用者
    let caller = self.caller;
    console.log( caller );
    return a + b;
}

// 用"函数表达式"定义函数
let divide = function(a, b) {
    console.log( arguments );
    console.log( arguments.callee );
    console.log( arguments.callee.caller );
    return a / b;
}

// 用"函数声明"定义函数
function outer(){

    const args = arguments;
    console.log( args );
    console.log( args.callee.caller );

    // 用"箭头函数表达式"定义函数
    let hello = name => {
        console.log( name );
        // 箭头函数本身没有 arguments 变量
        // 但是在箭头函数中可以访问其外部函数的arguments变量
        console.log( arguments === args );
        console.log( arguments.callee.caller );
    }

    // 调用箭头函数
    hello('afang');
}

function launch(){
    add(10, 20);
    console.log( '- '.repeat(20) );
    divide(50, 3);
    console.log( '- '.repeat(20) );
    outer('俺是外面的');
}

launch();

console.log( arguments.callee.toString() );